
/*
 * Copyright (c) 2010 Sergey N Frolov
 * 
 * See LICENSE file
 */

#ifndef _NGX_HTTP_JAVASCRIPT_MODULE_FILE_H_INCLUDED_
#define _NGX_HTTP_JAVASCRIPT_MODULE_FILE_H_INCLUDED_

#include "ngx_http_javascript_module.h"

#include <sys/file.h>

typedef struct {
	FILE *F;
	int fd;
} ngx_javascript_file_t;

JSBool ngx_javascript_init_file(JSContext *jcx, JSObject *global);

jsval ngx_javascript_stat_value(JSContext *jcx, struct stat *st);
JSBool ngx_javascript_file_stat_file(JSContext *jcx, JSObject *obj, struct stat *st);
JSBool ngx_javascript_file_stat_name(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval, struct stat *st, int link, int ex);
char *ngx_javascript_file_argument_name(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, int ex);
char *ngx_javascript_file_argument_name1(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, int ex);
JSBool ngx_javascript_file_copy(JSContext *jcx, char *filesrc, char *filedst);

JSBool ngx_javascript_file_class_open(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_stat(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_lstat(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_basename(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_dirname(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_realpath(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_chmod(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_copy(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_exists(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_is_dir(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_is_executable(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_is_file(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_is_link(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_is_readable(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_is_writable(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_link(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_mkdir(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_readlink(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_rmdir(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_symlink(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_class_unlink(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);

JSBool ngx_javascript_file_object(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);

JSBool ngx_javascript_file_object_get_bytes(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_get_chars(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_write_bytes(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_write_chars(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_stat(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_close(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_eof(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_lock(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_seek(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_tell(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_realpath(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_basename(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_dirname(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_flush(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_truncate(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
JSBool ngx_javascript_file_object_rewind(JSContext *jcx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);

void ngx_javascript_file_finalize(JSContext *jcx, JSObject *obj);

JSBool ngx_javascript_file_error(JSContext *jcx, int code, const char *message);

#endif /* _NGX_HTTP_JAVASCRIPT_MODULE_FILE_H_INCLUDED_ */
